1913D - Array Collapse - CodeForces Solution


data structures divide and conquer dp trees

Please click on ads to support us..

C++ Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int inf=0x3f;
ll n,mod=998244353;
ll p[300010];
ll q[300010];
ll f[300010];
ll l[300010]; 
ll s[300010];
void init() {
	for(int i=1;i<=n+1;i++) p[i]=q[i]=f[i]=l[i]=s[i]=0;
}
int main() {
	int t;
	cin>>t;
	while(t--) {
		cin>>n;
		init();
		for(int i=1;i<=n;i++) cin>>p[i];
		l[1]=0,p[n+1]=2e16;
		for(int i=2;i<=n+1;i++) {
			int x=i-1;
			while(x&&p[x]>=p[i]) x=l[x];
			l[i]=x;
		}
		f[0]=q[0]=s[0]=1;
		for(int i=1;i<=n+1;i++) {
			f[i]=((s[i-1]-s[l[i]]+q[l[i]])%mod+mod)%mod;
			if(l[i]) q[i]=(f[i]+q[l[i]])%mod;
			else q[i]=f[i];
			s[i]=(s[i-1]+f[i])%mod;
		}
//		for(int i=1;i<=n;i++) cout<<f[i]<<' ';
//		cout<<endl;
		cout<<f[n+1]<<'\n';
	} 
    return 0;
}


Comments

Submit
0 Comments
More Questions

1436A - Reorder
1363C - Game On Leaves
1373C - Pluses and Minuses
1173B - Nauuo and Chess
318B - Strings of Power
1625A - Ancient Civilization
864A - Fair Game
1663B - Mike's Sequence
448A - Rewards
1622A - Construct a Rectangle
1620A - Equal or Not Equal
1517A - Sum of 2050
620A - Professor GukiZ's Robot
1342A - Road To Zero
1520A - Do Not Be Distracted
352A - Jeff and Digits
1327A - Sum of Odd Integers
1276A - As Simple as One and Two
812C - Sagheer and Nubian Market
272A - Dima and Friends
1352C - K-th Not Divisible by n
545C - Woodcutters
1528B - Kavi on Pairing Duty
339B - Xenia and Ringroad
189A - Cut Ribbon
1182A - Filling Shapes
82A - Double Cola
45A - Codecraft III
1242A - Tile Painting
1663E - Are You Safe